package com.redsoft.spirit.service;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.redsoft.spirit.dao.MenuRoleRepository;
import com.redsoft.spirit.dao.RoleAccountRepository;
import com.redsoft.spirit.dao.RoleRepository;
import com.redsoft.spirit.entity.MenuRole;
import com.redsoft.spirit.entity.Role;
import com.redsoft.spirit.entity.RoleAccount;
import com.redsoft.spirit.util.AuthDataHandler;
import com.redsoft.spirit.util.BeanUtils;

/**
 * 菜单的业务逻辑层.
 * 
 * <pre>
 * 提供菜单部分功能的业务操作
 * </pre>
 * 
 * @author 杨雷
 * @since 1.0
 */
@Service
@Transactional
public class RoleService {

	@Autowired
	private RoleRepository roleRepository;

	@Autowired
	private MenuRoleRepository menuRoleRepository;

	@Autowired
	private RoleAccountRepository roleAccountRepsitory;

	@Autowired
	private AuthorizationService authorizationService;

	/**
	 * 角色新增或者修改方法
	 * 
	 * <pre>
	 * 角色新增或者修改方法
	 * </pre>
	 * 
	 * @author 杨雷
	 * @param role
	 * @throws Exception
	 */
	public void saveOrUpdateRole(Role role) throws Exception {
		role.setCreateTime(new Date());
		// 如果id为空则是新增操作
		if ("".equals(role.getId())) {
			roleRepository.save(role);
		} else {
			Role oldRole = roleRepository.findById(role.getId());
			BeanUtils.copyBeanNotNull2Bean(role, oldRole);
			roleRepository.save(role);
		}
	}

	/**
	 * 分页查询角色列表.
	 * 
	 * <pre>
	 * 分页查询角色列表
	 * </pre>
	 * 
	 * @author 杨雷
	 * @param offset
	 * @param limit
	 * @param searchKey
	 * @param userId
	 * @param deptId
	 * @return
	 */
	public HashMap getJsonData(int offset, int limit, String searchKey, String userId, String deptId) {

		StringBuilder sql = new StringBuilder();

		sql.append("select r.*, sa.real_name userName " + " from sys_role r " + " left join sys_account sa"
				+ " on sa.id = r.creator_id " + " where 1=1 ");

		Map<String, Object> map = new HashMap<>();
		// if (userId != null && !"".equals(userId)) {
		// sql += " AND r.creator_id = :userId ";
		// map.put("userId", userId);
		// }
		// if (deptId != null && !"".equals(deptId)) {
		// sql += " AND r.dept_id = :deptId ";
		// map.put("deptId", deptId);
		// }

		StringBuilder countSql = new StringBuilder().append("select count(1) from (" + sql + ") r where 1=1 ");

		if (!"".equals(searchKey) && searchKey != null) {
			map.put("searchKey", "%" + searchKey + "%");
			sql.append("and r.role_name like :searchKey");
			countSql.append("and r.role_name like :searchKey");
		}

		AuthDataHandler.setAuthDataSql(userId, sql, countSql, map);
		// authorizationService.getAuthSql(userId, sql, countSql, map);

		return roleRepository.sqlQuery(sql.toString(), countSql.toString(), map, offset, limit, "total", "rows");
	}

	/**
	 * 删除角色
	 * 
	 * <pre>
	 * 删除角色
	 * </pre>
	 * 
	 * @author 杨雷
	 * @param list
	 */
	public void delete(List<String> list) {
		roleRepository.deleteByIds(list);
	}

	/**
	 * 查询所有的角色
	 * 
	 * <pre>
	 * 查询所有的角色
	 * </pre>
	 * 
	 * @author 杨雷
	 * @return
	 */
	public List<Role> getRoleList() {
		return roleRepository.findAll();
	}

	public List<Role> getRoleListByDept(String deptId) {
		return roleRepository.findByDeptId(deptId);
	}

	/**
	 * 给某个角色下增加人员
	 * 
	 * <pre>
	 * 给某个角色下增加人员
	 * </pre>
	 * 
	 * @author 杨雷
	 * @param roleId
	 * @param userId
	 */
	public void addRoleUser(String roleId, String userId) {
		RoleAccount roleAccount = new RoleAccount();
		roleAccount.setAccountId(userId);
		roleAccount.setRoleId(roleId);
		roleAccountRepsitory.save(roleAccount);
	}

	/**
	 * 删除某个角色下的某个人员
	 * 
	 * <pre>
	 * 删除某个角色下的某个人员
	 * </pre>
	 * 
	 * @author 杨雷
	 * @param roleId
	 * @param userId
	 */
	public void deleteRoleUser(String roleId, String userId) {
		roleAccountRepsitory.deleteByRoleIdAndAccountId(roleId, userId);
	}

	/**
	 * 保存角色和一堆分配的菜单id
	 * 
	 * <pre>
	 * 保存角色和一堆分配的菜单id
	 * </pre>
	 * 
	 * @author 杨雷
	 * @param roleId
	 * @param menuIds
	 * @param indeterminateIds
	 */
	public void saveRoleMenu(String roleId, String menuIds, String indeterminateIds) {
		// 先删除这个角色下分配的所有菜单
		menuRoleRepository.deleteByRoleId(roleId);

		String[] ids = menuIds.split(",");
		String[] indeIds = indeterminateIds.split(",");

		for (String string : ids) {
			MenuRole menuRole = new MenuRole();
			menuRole.setRoleId(roleId);
			menuRole.setMenuId(string);
			menuRole.setIndeterminateFlag("0");
			menuRoleRepository.save(menuRole);
		}

		for (String string : indeIds) {// 半选中状态父级菜单ID
			MenuRole menuRole = new MenuRole();
			menuRole.setRoleId(roleId);
			menuRole.setMenuId(string);
			menuRole.setIndeterminateFlag("1");
			menuRoleRepository.save(menuRole);
		}
	}

	/**
	 * 根据ID查询一条角色记录.返回角色实体类
	 * 
	 * <pre>
	 * 根据ID查询一条角色记录.返回角色实体类
	 * </pre>
	 * 
	 * @author 李晓东
	 * @param id
	 * @return
	 */
	public Role getById(String id) {
		return roleRepository.findById(id);
	}

	/**
	 * 根据userId查询其拥有的所有角色list
	 * 
	 * <pre>
	 * 根据userId查询其拥有的所有角色list
	 * </pre>
	 * 
	 * @author 杨雷
	 * @param userId
	 * @return
	 */
	public List<Role> getRoleListByUserId(String userId) {
		return roleRepository.getRoleListByUserId(userId);
	}
}
